#include <cstring>
#include <iostream>
using namespace std;

const int MOD = 1000000007;
const int MAX_N = 201; // 增加1
const int MAX_STEPS = 2 * MAX_N - 1;

char grid[MAX_N][MAX_N];         // 存储网格
int dp[MAX_STEPS][MAX_N][MAX_N]; // 动态规划数组

// 检查坐标是否在网格内且不是障碍物
bool isValid(int x, int y, int n) {
  return x >= 1 && x <= n && y >= 1 && y <= n && grid[x][y] != '#';
}

int main() {
  int n;
  cin >> n;

  // 读取网格
  for (int i = 1; i <= n; ++i) { // 从1开始
    cin >> (grid[i] + 1);        // 从1开始存储
  }

  memset(dp, 0, sizeof(dp));
  dp[0][1][1] = 1; // 起点方案数为1

  // 动态规划主循环
  for (int step = 1; step < 2 * n - 1; ++step) {
    for (int x1 = 1; x1 <= n; ++x1) { // 从1开始
      int y1 = step - x1 + 2;         // 调整y1计算
      if (!isValid(x1, y1, n))
        continue;

      for (int x2 = x1; x2 <= n; ++x2) { // 从1开始
        int y2 = step - x2 + 2;          // 调整y2计算
        if (!isValid(x2, y2, n))
          continue;

        // 避免两人在同一格子（除起点和终点）
        if (step != 2 * n - 2 && x1 == x2 && y1 == y2)
          continue;

        // 更新方案数
        dp[step][x1][x2] = (dp[step][x1][x2] + dp[step - 1][x1][x2]) % MOD;
        if (x1 > 1 && x2 > 1)
          dp[step][x1][x2] =
              (dp[step][x1][x2] + dp[step - 1][x1 - 1][x2 - 1]) % MOD;
        if (x1 > 1)
          dp[step][x1][x2] =
              (dp[step][x1][x2] + dp[step - 1][x1 - 1][x2]) % MOD;
        if (x2 > 1)
          dp[step][x1][x2] =
              (dp[step][x1][x2] + dp[step - 1][x1][x2 - 1]) % MOD;
      }
    }
  }

  cout << dp[2 * n - 2][n][n] << endl;
  return 0;
}